package br.com.velp.sudecap.util;

/**
 * <sumario>
 * <objetivo>"Rastreabilidade"</objetivo>
 * <autor>EDUARDO SANTOS DE OLIVEIRA</autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 19.11.2013 </data_criacao>
 * <data_ultima_alteracao> 20.11.2013 </data_ultima_alteracao>
 * <requisito_afetado> N/A </requisito_afetado>
 * <descricao> Classe Utilitária Para Validação de Documentos </descricao>
 * </sumario>
 */
public class ValidaDocumentosUtil {

    private static Integer   somadorUltimoDigito;
    private static Integer   somadorPenultimoDigito;
    private static Integer   penultDigCalculado;
    private static Integer   ultimoDigCalculado;
    private static Integer   ultimoDigitoOri;
    private static Integer   penultimoDigitoOri;
    private static Integer[] arrayValues;

    public static boolean isCpfValido(String cpf){

        if(isBlackListCpf(cpf)){
            return false;
        }

        initParameters(cpf);
        
        //Somatório dos Dígitos - Penúltimo Dígito
        for(int i = 0; i < 9; i++){
            int digito = arrayValues[i];
            somadorPenultimoDigito = somadorPenultimoDigito + (digito * (10 - i));
        }

        //Calcula o Penúltimo Dígito Verificador
        if(somadorPenultimoDigito % 11 >= 2){
            penultDigCalculado = 11 - (somadorPenultimoDigito % 11);
        }

        //Somatório dos Dígitos - Último Dígito
        for(int i = 0; i < 10; i++){
            int digito = ((i == 9) ? penultDigCalculado : arrayValues[i]);
            somadorUltimoDigito = somadorUltimoDigito + (digito * (11 - i));
        }

        //Calcula o Último Dígito Verificador
        if(somadorUltimoDigito % 11 >= 2){
            ultimoDigCalculado = 11 - (somadorUltimoDigito % 11);
        }

        if(penultDigCalculado != penultimoDigitoOri || ultimoDigCalculado != ultimoDigitoOri){
            return false;
        }

        return true;

    }

    public static boolean isCnpjValido(String cnpj){

        initParameters(cnpj);

        //Somatório dos Dígitos - Penúltimo Dígito
        for(int i = 0; i < 12; i++){
            int digito = arrayValues[i];
            if(i < 4){
                somadorPenultimoDigito = somadorPenultimoDigito + (digito * (5 - i));
            }else{
                somadorPenultimoDigito = somadorPenultimoDigito + (digito * (13 - i));
            }
        }

        //Calcula o Penúltimo Dígito Verificador
        if(somadorPenultimoDigito % 11 >= 2){
            penultDigCalculado = 11 - (somadorPenultimoDigito % 11);
        }

        //Somatório dos Dígitos - Último Dígito
        for(int i = 0; i < 13; i++){
            int digito = arrayValues[i];
            if(i < 5){
                somadorUltimoDigito = somadorUltimoDigito + (digito * (6 - i));
            }else{
                somadorUltimoDigito = somadorUltimoDigito + (digito * (14 - i));
            }
        }

        //Calcula o Último Dígito Verificador
        if(somadorUltimoDigito % 11 >= 2){
            ultimoDigCalculado = 11 - (somadorUltimoDigito % 11);
        }

        if(penultDigCalculado != penultimoDigitoOri || ultimoDigCalculado != ultimoDigitoOri){
            return false;
        }

        return true;

    }

    /**
     * Converte Uma String Numérica em um Array de Inteiros
     * @param String values
     * @return Integer[] values
     */
    private static Integer[] stringToIntegerArrayConverter(String value){

        String valoresReplace  =  value.replace(".", "").replace("-", "").replace("/", "");
        Integer[] vetorInt     =  new Integer[valoresReplace.length()];

        for (int i = 0; i < valoresReplace.length(); i++){
             vetorInt[i] = Integer.valueOf(valoresReplace.substring(i, i + 1));
        }

        return vetorInt;

    }

    private static void initParameters(String value){
         arrayValues             =  stringToIntegerArrayConverter(value);
         ultimoDigitoOri         =  arrayValues[arrayValues.length - 1];
         penultimoDigitoOri      =  arrayValues[arrayValues.length - 2];
         somadorUltimoDigito     =  0;
         somadorPenultimoDigito  =  0;
         penultDigCalculado      =  0;
         ultimoDigCalculado      =  0;
    }

    /**
     * Verifica a Presença do CPF na Lista Negra de Valores a
     * Serem Rejeitados
     * @param String cpf
     * @return TRUE  - Caso Esteja Presente na Lista Negra
     *         FALSE - Caso Contrário
     */
    private static boolean isBlackListCpf(String cpf){

        String[] blackList = new String[]{ "00000000000",
                                           "11111111111",
                                           "22222222222",
                                           "33333333333",
                                           "44444444444",
                                           "55555555555",
                                           "66666666666",
                                           "77777777777",
                                           "88888888888",
                                           "99999999999" };

        for(String s : blackList){
            if(s.equals(cpf)){
                return true;
            }
        }

        return false;

    }

}
